﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using mshtml;
using ImageComboBox;
using System.IO;
using System.Collections;
using System.Net;

namespace BK_CLIENT
{
    public partial class BK_CHAT : Form
    {
        public HostWebcam wc;
        // IHTMLDocument2 cho cửa sổ gửi tin
        IHTMLDocument2 docSend;
        // IHTMLDocument2 cho cửa sổ hiện tin
        IHTMLDocument2 docDisplay;
        // Tên font
        private string font = "Time News Roman";
        // Kích cỡ font
        private string size = "0";
        // Có dùng Bold hay không
        // 0: không dùng Bold; 1: có dùng Bold
        private int checkBold = 0;
        // Có dùng Italic hay không
        // 0: không dùng Italic; 1: có dùng Italic
        private int checkItalic = 0;
        // Có dùng Underline hay không
        // 0: không dùng Underline; 1: có dùng Underline
        private int checkUnderline = 0;
        // Có dùng Link hay không
        // 0: không dùng Link; 1: có dùng Link
        private int checkLink = 0;

        // Xâu chứa các đoạn chữ in đậm
        private string boldText = "";
        // Xâu chứa các đoạn chữ in nghiêng
        private string italicText = "";
        // Xâu chứa các đoạn chữ gạch chân
        private string underlineText = "";

        // Form chính
        public CLIENT_FORM formStart;
        // Tên người đang sở hữu form chính
        private string me;
        private string head = "";
        // Chuỗi bạn bè
        private string myfriend;
        // Hashtable dùng để chứa emoticon.
        private Hashtable ListEmoticon;

        string msg = "";
        //Thêm
        public static string sDirEmoticon = "";
        // Khởi tạo form
        public BK_CHAT(CLIENT_FORM form, string send, string receive)
        {
            InitializeComponent();
            SetupFontComboBox();
            sDirEmoticon = System.Environment.CurrentDirectory;
            sDirEmoticon = sDirEmoticon + "\\Emoticon\\";
            formStart = form;
            me = send;
            myfriend = receive;
            this.Text = receive;
        }
        ~BK_CHAT()
        {
            me = null;
            formStart.RemoveChatDialog(myfriend);
            myfriend = null;
            this.Dispose();
            this.Close();
        }

        private void BK_CHAT_UnLoad_1()
        {
            me = null;
            formStart.RemoveChatDialog(myfriend);
            myfriend = null;
        }

        // Khởi tạo các thuộc tính khi form được load lên
        private void BK_CHAT_Load_1(object sender, EventArgs e)
        {
            // Load twos empty websites.
            webBrowserSend.DocumentText = "<html><body></body></html>";
            webBrowserDisplay.DocumentText = "<html><body></body></html>";
            docSend = webBrowserSend.Document.DomDocument as IHTMLDocument2;
            docDisplay = webBrowserDisplay.Document.DomDocument as IHTMLDocument2;
            // Chat Box is turned on
            docSend.designMode = "On";
            // Chat Display is turned off
            docDisplay.designMode = "Off";
            // Thiết lập giá trị cho Hashtable
            ListEmoticon = new Hashtable();
            ListEmoticon.Add("O:-)", "angle");
            ListEmoticon.Add("X(", "angry");
            ListEmoticon.Add(":D", "biggrin");
            ListEmoticon.Add(">:H<", "bighug");
            ListEmoticon.Add(":-s", "socold");
            ListEmoticon.Add("B-)", "cool");
            ListEmoticon.Add("3:-O", "cow");
            ListEmoticon.Add("\\D/", "dancing");
            ListEmoticon.Add("X_X", "dontsee");
            ListEmoticon.Add(":-??", "idontknow");
            ListEmoticon.Add(":))", "laughing");
            ListEmoticon.Add(":X", "lovestruct");
            ListEmoticon.Add("%-(", "notlistening");
            ListEmoticon.Add("[-O<", "praying");
            ListEmoticon.Add("=))", "rollingonfloor");
            ListEmoticon.Add("@};-", "rose");
            ListEmoticon.Add("[-X", "shameonyou");
            ListEmoticon.Add("B-}", "silly");
            ListEmoticon.Add(":-?", "thinking");
            ListEmoticon.Add(":-t", "timeout");
            ListEmoticon.Add(":-h", "wave");
            ListEmoticon.Add("#:-S", "whew");
            ListEmoticon.Add(";))", "hehe");
            ListEmoticon.Add("~:>", "chicken");
            ListEmoticon.Add("o->", "hiro");
            ListEmoticon.Add(":-z", "rexona");

        }

        // Cài đặt chữ in đậm
        private void setBold()
        {
            while (boldText.Length > 0)
            {
                string temp = boldText.Substring(0, boldText.IndexOf("#@#"));
                boldText = boldText.Remove(0, boldText.IndexOf("#@#") + 3);
                int pos = msg.IndexOf(temp);
                if (pos >= 0)
                {
                    string bold = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + temp.Length);
                    temp = "<b>" + temp + "</b>";
                    msg = bold + temp + msg;
                }
            }
            boldText = "";
        }
        // Cài chữ in nghiêng
        private void setItalic()
        {
            while (italicText.Length > 0)
            {
                string temp = italicText.Substring(0, italicText.IndexOf("#@#"));
                italicText = italicText.Remove(0, italicText.IndexOf("#@#") + 3);
                int pos = msg.IndexOf(temp);
                if (pos >= 0)
                {
                    string italic = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + temp.Length);
                    temp = "<i>" + temp + "</i>";
                    msg = italic + temp + msg;
                }
            }
            italicText = "";
        }
        private void setUnderline()
        {
            while (underlineText.Length > 0)
            {
                string temp = underlineText.Substring(0, underlineText.IndexOf("#@#"));
                underlineText = underlineText.Remove(0, underlineText.IndexOf("#@#") + 3);
                int pos = msg.IndexOf(temp);
                if (pos >= 0)
                {
                    string underline = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + temp.Length);
                    temp = "<u>" + temp + "</u>";
                    msg = underline + temp + msg;
                }
            }
            underlineText = "";
        }
        // Xử l khi nhấn nút SEND
        // Kiểm tra và cập nhật các thông số về kích thước chữ, loại font, các thuộc tính Bold, Italic, Underline, Link
        // Gọi phương thức GetText, với tham số kindChat = 1 --> Chatroom  để gửi tin đi
        // Hiển thị nội dung chat lên cửa  sổ hiện tin
        private void buttonSend_Click(object sender, EventArgs e)
        {
            head = "<font size = '+" + size + "' face = '" + font + "'> ";
            msg = webBrowserSend.Document.Body.InnerHtml;

            string check = msg;
            if (checkBold == 1)
            {
                head = "<b>" + head;
                msg = head + msg + " </font></b>";
            }
            if (checkItalic == 1)
            {
                head = "<i>" + head;
                msg = head + msg + " </font></i>";
            }
            if (checkUnderline == 1)
            {
                head = "<u>" + head;
                msg = head + msg + " </font></u>";
            }
            if (checkLink == 1)
            {
                head = "<a href = '";
                string temp = msg;
                if (temp.IndexOf("http://") == -1)
                {
                    temp = "http://" + temp;
                }
                msg = head + temp + "' target='blank' > " + temp + " </font></a>";
            }
            else
            {
                string tempMsg;
                if (msg.IndexOf("http://") != -1)
                {
                    string link = "";
                    tempMsg = msg.Substring(0, msg.IndexOf("http://"));
                    msg = msg.Remove(0, msg.IndexOf("http://"));
                    if (msg.IndexOf(" ") == -1)
                    {
                        msg = "<a href='" + msg + "' target = 'blank'> " + msg + " </a>";
                    }
                    else
                    {
                        link = msg.Substring(0, msg.IndexOf(" "));
                        msg = msg.Remove(0, msg.IndexOf(" "));
                        link = "<a href='" + link + "' target = 'blank'> " + link + " </a>";
                        msg = tempMsg + link + msg;
                    }
                }
            }
            if (checkBold == 0 && checkItalic == 0 && checkUnderline == 0 && checkLink == 0)
            {
                msg = head + msg + "  </font>";
            }
            if (checkLink == 1)
            {
                checkLink = 0;
            }

            // Hiện thị message vào ô Display
            if (check != "")
            {
                if (boldText != "")
                {
                    setBold();
                }
                if (italicText != "")
                {
                    setItalic();
                }
                if (underlineText != "")
                {
                    setUnderline();
                }
                formStart.GetText(msg, me, myfriend, 0);
                string displayMsg = "<br><font color = '#000099'>" + me + ":</font> " + msg;

                bool isHasEmo;
                // Sửa mã của emo thành ảnh tương ứng
                do
                {
                    isHasEmo = false;
                    foreach (DictionaryEntry oneEmoticon in ListEmoticon)
                    {
                        string _key = oneEmoticon.Key.ToString();
                        string _value = oneEmoticon.Value.ToString();
                        int position = displayMsg.IndexOf(_key);
                        if (position != -1)
                        {
                            string temp = displayMsg.Substring(0, position);
                            displayMsg = displayMsg.Remove(0, position + _key.Length);
                            string img = sDirEmoticon + _value + ".gif";
                            img = "<img src = '" + img + "' title = ' " + _value + "' />";
                            displayMsg = temp + img + displayMsg;
                            isHasEmo = true;
                            break;
                        }
                    }
                } while (isHasEmo);

                webBrowserDisplay.DocumentText += displayMsg;
                webBrowserSend.DocumentText = "";
                webBrowserSend.Document.Write(string.Empty);
            }
        }

        // Hiển thị tin nhắn lên form hiển thị
        public void DisplayMessage(string msg_receive)
        {
            string displayMsg = msg_receive;
            bool isHasEmo;
            // Sửa mã của emo thành ảnh tương ứng
            do
            {
                isHasEmo = false;
                foreach (DictionaryEntry oneEmoticon in ListEmoticon)
                {
                    string _key = oneEmoticon.Key.ToString();
                    string _value = oneEmoticon.Value.ToString();
                    int position = displayMsg.IndexOf(_key);
                    if (position != -1)
                    {
                        string temp = displayMsg.Substring(0, position);
                        displayMsg = displayMsg.Remove(0, position + _key.Length);
                        string img = sDirEmoticon + _value + ".gif";
                        img = "<img src = '" + img + "' title = ' " + _value + "' />";
                        displayMsg = temp + img + displayMsg;
                        isHasEmo = true;
                        break;
                    }
                }
            } while (isHasEmo);
            
            webBrowserDisplay.DocumentText += displayMsg;
        }

        // Xử lí khi nhận file
        // Cho phép tùy chọn có nhận hay không
        public void SaveFile(string fName, string fileCont)
        {
            if (MessageBox.Show("Do you want to save file '" + fName + "' from " + me, "Save File", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                byte[] todecode_byte;
                // Giai ma Noi dung File
                try
                {
                    todecode_byte = Convert.FromBase64String(fileCont);
                }
                catch (Exception e)
                {
                    throw new Exception("Error in base64Decode " + e.Message);
                }

                // Save File
                SaveFileDialog sFiDg = new SaveFileDialog();
                sFiDg.Filter = "All files (*.*)|*.*";
                sFiDg.FileName = fName;
                if (sFiDg.ShowDialog() == DialogResult.OK)
                {
                    //PROGRESS_RECEIVED_FILE newFile = new PROGRESS_RECEIVED_FILE(sFiDg, result);
                    //newFile.Show();
                    File.WriteAllBytes(sFiDg.FileName, todecode_byte);
                    MessageBox.Show("Đã nhận xong file !");
                }
            }
        }

        // Cài đặt các tên font
        private void SetupFontComboBox()
        {
            AutoCompleteStringCollection ac = new AutoCompleteStringCollection();
            foreach (FontFamily fam in FontFamily.Families)
            {

                toolStripComboBoxFont.Items.Add(fam.Name);
                ac.Add(fam.Name);
            }
        }

        // Chuyển đổi loại font
        private void toolStripComboBoxFont_SelectedIndexChanged(object sender, EventArgs e)
        {
            font = toolStripComboBoxFont.Text;
            webBrowserSend.Document.ExecCommand("FontName", false, font);
        }
        // Chuyển đổi kích thước chữ
        private void toolStripComboBoxFontSize_SelectedIndexChanged(object sender, EventArgs e)
        {
            size = toolStripComboBoxFontSize.Text;
            webBrowserSend.Document.ExecCommand("FontSize", false, size);
        }

        // Thay đổi thuộc tính gạch chân văn bản
        private void toolStripButtonUnderline_Click(object sender, EventArgs e)
        {
            string selectText = "";
            webBrowserSend.Document.ExecCommand("Underline", false, null);
            webBrowserSend.Document.ExecCommand("copy", true, null);
            selectText = Clipboard.GetText();
            if (selectText != "")
            {
                underlineText += selectText + "#@#";
            }
            else
            {
                if (checkUnderline == 0)
                    checkUnderline = 1;
                else
                    checkUnderline = 0;

            }
        }

        // Thay đổi thuộc tính chữ in đậm
        private void toolStripButtonBold_Click(object sender, EventArgs e)
        {
            string selectText = "";
            webBrowserSend.Document.ExecCommand("Bold", false, null);
            webBrowserSend.Document.ExecCommand("copy", true, null);
            selectText = Clipboard.GetText();
            if (selectText != "")
            {
                boldText += selectText + "#@#";
            }
            else
            {
                if (checkBold == 0)
                    checkBold = 1;
                else
                    checkBold = 0;
            }
        }

        // Thay đổi thuộc tính chữ in nghiêng
        private void toolStripButtonItalic_Click(object sender, EventArgs e)
        {
            string selectText = "";
            webBrowserSend.Document.ExecCommand("Italic", false, null);
            webBrowserSend.Document.ExecCommand("copy", true, null);
            selectText = Clipboard.GetText();
            if (selectText != "")
            {
                italicText += selectText + "#@#";
            }
            else
            {
                if (checkItalic == 0)
                    checkItalic = 1;
                else
                    checkItalic = 0;
            }
        }

        // Chọn emoticon
        private void imageComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string emoticon = imageComboBox.Text;

            foreach (DictionaryEntry oneEmoticon in ListEmoticon)
                if (oneEmoticon.Value.ToString().Equals(emoticon))
                {
                    string _key = oneEmoticon.Key.ToString();
                    Clipboard.SetText(_key);
                    webBrowserSend.Document.ExecCommand("Unselect", false, null);
                    webBrowserSend.Document.ExecCommand("Paste", false, null);
                    return;
                }
        }

        // Chọn gửi link
        private void toolStripButtonLink_Click(object sender, EventArgs e)
        {
            webBrowserSend.Document.ExecCommand("CreateLink", false, null);
            checkLink = 1;
        }

        // Chọn menu Send file

        private void sendFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FileDialog fDg = new OpenFileDialog();
            fDg.Filter = "All files (*.*)|*.*";
            if (fDg.ShowDialog() == DialogResult.OK)
            {
                formStart.SendFile(fDg.FileName, me, myfriend, 0);
            }
        }
        // Chọn menu help
        private void helpToolStripMenuItem_Click(object sender, EventArgs e)
        {
            const string msg = "Client - BTL Công nghệ .Net";
            const string caption = "BK Messenger's Information";
            MessageBox.Show(null, msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        // Click menu Exit
        private void addFriendsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            me = null;
            formStart.RemoveChatDialog(myfriend);
            this.Dispose();
            this.Close();
        }

        private void toolStripButtonSendFile_Click(object sender, EventArgs e)
        {
            FileDialog fDg = new OpenFileDialog();
            fDg.Filter = "All files (*.*)|*.*";
            if (fDg.ShowDialog() == DialogResult.OK)
            {
                formStart.SendFile(fDg.FileName, me, myfriend, 0);
            }
        }

        private void webcamToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Mo ket noi
            wc = new HostWebcam();
            wc.Show();
            wc.HostWC.StartConnection();
            // Gui yeu cau xem webcam
            msg = "";
            formStart.GetText(msg, me, myfriend, 9);
        }
    }
}
